package challenge._2021;

import java.util.Arrays;
import java.util.Scanner;

/**
 * @author 挚爱之夕
 * @version 1.0
 * @implSpec 说明
 * 小王同学刚拿到驾照，她想要在参加完计算机能力挑战赛后带上自己的好闺蜜出去旅行，
 * 她想驾驶汽车以最少的费用从一个城市到另一个城市（假设出发时油箱是空的）。
 * 给定两个城市之间的距离D1、汽车油箱的容量C（以升为单位）、每升汽油能行驶的距离D2、
 * 出发点每升汽油价格P和沿途油站数N（N可以为零），油站i离出发点的距离Di、每升汽油价格Pi（i=1，2，……N）。
 * 计算结果四舍五入至小数点后两位。如果无法到达目的地，则输出“No Solution”。
 * 输入格式
 * <p>
 * 输入描述:
 * 第一行为4个实数D1、C、D2、P与一个非负整数N；
 * 接下来N行，每行两个实数Di、Pi。
 * 输入样例:
 * 275.6 11.9 27.4 2.8 2
 * 102.0 2.9
 * 220.0 2.2
 * <p>
 * 输出格式
 * <p>
 * 输出描述:
 * 如果可以到达目的地，输出一个实数（四舍五入至小数点后两位），表示最小费用；否则输出“No Solution”（不含引号）。
 * 输出样例:
 * 26.95
 * <p>
 * 样例
 * 输入数据 1
 * 275.6 11.9 27.4 2.8 2
 * 102.0 2.9
 * 220.0 2.2
 * 输出数据 1
 * 26.95
 * @since 2022 - 11 - 17 - 13:58
 */
public class _04说走就走的旅行 {
    public static void main(String[] args) {
        for (int i = 1; i < 10; i++) {
            System.out.println(27.4 * 2.8 * i);
        }
    }
}

class Main4 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        double D1, C, D2, P;
        int N;
        D1 = sc.nextDouble();
        C = sc.nextDouble();
        D2 = sc.nextDouble();
        P = sc.nextDouble();
        N = sc.nextInt();

        //满油状态的最大行驶距离
        double maxLen = C * D2;
        //加油站的距离
        double[] dis = new double[N + 1];
        //加油站的价格
        double[] price = new double[N + 1];

        for (int i = 1; i <= N; i++) {
            dis[i] = sc.nextDouble();
            price[i] = sc.nextDouble();
            //两个相邻的加油站距离超过最大行驶距离，无法到达
            if (dis[i] - dis[i - 1] > maxLen) {
                System.out.println("No Solution");
                return;
            }
        }

        //当前加油站的油价 当前加油站后可达加油站的最低油价
        double curPrice = P, minPrice = P;
        //当前行驶距离 油箱油量
        double curDis = 0, remain = 0;
        int index = 0;
        double res = 0;
        while (curDis < D1) {
            //在后面可达的油站中找比当前油价低的且 最低
            for (int i = index + 1; i <= N; i++) {
                if (dis[i] - curDis > maxLen) break;
                if (price[i] < minPrice) {
                    index = i;
                    minPrice = price[i];
                }
            }
            if (minPrice < curPrice) {  //找到一个最低油价的油站
                //去那个最低的油站
                res += ((dis[index] - curDis) / D2 - remain) * curPrice;
                remain = (dis[index] - curDis) / D2;
            } else {    //当前站油价最低
                if (D1 - curDis > maxLen) { //无法直接到达终点
                    res += (C - remain) * curPrice;
                    remain = C;
                } else {    //可直接到达终点
                    res += ((D1 - curDis) / D2 - remain) * curPrice;
                    break;
                }
            }
            //去下一个加油站
            remain = remain - (dis[index] - curDis) / D2;
            curDis = dis[index];
            curPrice = minPrice;
            //换成极大的数，更新index
            minPrice = Integer.MAX_VALUE;
        }
        System.out.printf("%.2f", res);
    }
}
